package com.zzg.datastructure.binarysorttree.entity;

import lombok.ToString;

import java.util.Objects;

/**
 * @Author zhengzg
 * @Date 2022-09-30
 * @Version v1.0
 */
@ToString(of = {"value"})
public class Node {
    public int value;

    public Node left;

    public Node right;

    public Node(int value) {
        this.value = value;
    }

    /**
     * 查找要删除的节点
     * @param value 要查找的值
     * @return 要删除的节点
     */
    public Node search(int value) {
        if (value == this.value) {
            return this;
        } else if (value < this.value) {
            // 如果查找的值小于当前节点，向左子树递归查找
            // 如果左子节点为空
            if (Objects.isNull(this.left)) {
                return null;
            }
            return this.left.search(value);
        } else {
            // 如果查找的值不小于当前节点，向右递归查找
            if (Objects.isNull(this.right)) {
                return null;
            }
            return this.right.search(value);
        }
    }

    /**
     * 查找父节点
     * 如果存在多个相同的数字，则查找结果只返回第一个
     * @param value 要查找的节点的值
     * @return 父节点
     */
    public Node searchParent(int value) {
        // 如果当前节就是要删除的节点的父节点，就返回
        if ((Objects.nonNull(this.left) && this.left.value == value) || (Objects.nonNull(this.right) && this.right.value == value)) {
            return this;
        } else {
            // 如果查找的值小于当前节点的值，并且当前节点的左子节点不为空
            if (value < this.value && Objects.nonNull(this.left)) {
                return this.left.searchParent(value);
            } else if (value >= this.value && Objects.nonNull(this.right)) {
                return this.right.searchParent(value);
            } else {
                // 没有找到父节点
                return null;
            }
        }
    }

    /**
     * 添加节点
     * 1.传入节点小于调用节点的左子节点，递归向左
     * 2.传入节点大于调用节点的右子节点，递归向右
     * @param node 传入节点
     */
    public void add(Node node) {
        if (Objects.isNull(node)) {
            return;
        }

        // 判断传入节点的值，和当前子树的根节点的值关系
        if (node.value < this.value) {
            // 如果当前节点左子节点为null
            if (Objects.isNull(this.left)) {
                this.left = node;
            } else {
                // 递归的向左子树添加
                this.left.add(node);
            }
        } else {
            // 添加的节点的值大于当前节点的值
            if (Objects.isNull(this.right)) {
                this.right = node;
            } else {
                // 递归向右子树添加
                this.right.add(node);
            }
        }
    }

    // 中序遍历
    public void infixOrder(){
        if (Objects.nonNull(this.left)) {
            this.left.infixOrder();
        }
        System.out.println(this);
        if (Objects.nonNull(this.right)) {
            this.right.infixOrder();
        }
    }
}
